// @include "../code/Browser.js"
// @include "../code/Type.js"
// @include "../code/Class.js"
// @include "../code/Array.js"
// @include "../extend/Debug.js"

/**
 * @fileOverview 元素坐标的基础类
 * 
 * @version qinglan_vector 1.0
 * @static
 * @author wxq wxqqh@qq.com
 */
/**
 * 命名空间
 * 
 * @namespace
 * @type Object
 */
window.qinglan = window.qinglan || {};
/**
 * 记录元素坐标的基础类
 * 
 * @namespace
 * @type Object
 */
qinglan.Class.module('qinglan.Canvas.Vector', function() {
			return {
				/**
				 * 构造函数
				 * 
				 * @prarm {Number} x x轴坐标
				 * @prarm {Number} y y轴坐标
				 */
				constructor : function(x, y) {
					this.x = 0;
					this.x = 0;
				},
				/**
				 * 加上另外一个vector类
				 * 
				 * @param {qinglan.Canvas.Vector}
				 *            vector Vector的实例
				 * @return {qinglan.Canvas.Vector} this引用
				 */
				add : function(vector) {
					this.x += vector.x;
					this.y += vector.y;
					return this;
				},
				/**
				 * 减去另外一个vector类
				 * 
				 * @param {qinglan.Canvas.Vector}
				 *            vector Vector的实例
				 * @return {qinglan.Canvas.Vector} this引用
				 */
				sub : function(vector) {
					this.x -= vector.x;
					this.y -= vector.y;
					return this;
				},
				/**
				 * 乘以另外一个vector类
				 * 
				 * @param {qinglan.Canvas.Vector}
				 *            vector Vector 的实例
				 * @return {qinglan.Canvas.Vector} this引用
				 */
				mul : function(vector) {
					this.x *= vector.x;
					this.y *= vector.y;
					return this;
				},
				/**
				 * 除以另外一个vector类
				 * 
				 * @param {qinglan.Canvas.Vector}
				 *            vector Vector 的实例
				 * @return {qinglan.Canvas.Vector} this引用
				 */
				div : function(vector) {
					this.x -= vector.x == 0 ? 1 : vector.x;
					this.y -= vector.y == 0 ? 1 : vector.y;
					return this;
				},
				/**
				 * 得到vector的字串
				 */
				toString : function() {
					return this.x + ':' + this.y;
				}
			};
		}, {
			/**
			 * 得到vector的模
			 * 
			 * @param {qinglan.Canvas.Vector}
			 *            vector vector 的实例
			 * @return {Number} vector的模
			 */
			getMode : function(vector) {
				return Math.sqrt(vector.x * vector.x + vector.y * vector.y);
			},
			/**
			 * 得到vector的关于原点对称的像
			 * 
			 * @param {qinglan.Canvas.Vector}
			 *            vector vector 的实例
			 * @return {qinglan.Canvas.Vector}
			 */
			getNegative : function(vector) {
				vector.x *= -1;
				vector.y *= -1;
				return vector;
			},
			/**
			 * 得到本vector_1在另一个vector_2的投影
			 * 
			 * @param {qinglan.Canvas.Vector}
			 *            vector_1 vector 的实例
			 * @param {qinglan.Canvas.Vector}
			 *            vector_2 vector 的实例
			 * @return {Number} 投影长度
			 */
			getShadow : function(vector_1, vector_2) {
				return this.getMode(vector_1)
						* Math.cos(this.getAngel(vector_1, vector_2));
			},
			/**
			 * 得到vector的模为1的法向量<br/>
			 * 这里的法向量本应该有两个,但是这里只返回一个,另外一个可以通过取原点对称所得
			 * @param {qinglan.Canvas.Vector}
			 *            vector vector 的实例
			 * @return {qinglan.Canvas.Vector}法向量
			 */
			getNormal : function(vector) {
				var mode = this.getMode(vector);
				return new qinglan.Canvas.Vector(vector.x / mode, -vector.y
								/ mode);
			},
			/**
			 * 得到两个
			 * 
			 * @param {qinglan.Canvas.Vector}
			 *            vector_1
			 * @param {qinglan.Canvas.Vector}
			 *            vector_2
			 */
			getAngel : function(vector_1, vector_2) {
				return Math.acos((vector_1.x * vector_2.x + vector_1.y
						* vector.y)
						/ (this.getMode(vector_1) * this.getMode(vector_2)))
						* 180 / Math.PI;
			}
		});